#! /usr/bin/env node
// 2.将第一步程序设置为全局命令（8分）
const fs = require("fs")
const inquirer = require('inquirer');
const { program } = require('commander');
//4.使用inquirer包将第三步命令改造为交互命令
const prompt = inquirer.createPromptModule();
program.version('0.0.1')
    .option('-cp, --copy <item>', 'copy file')
    .option('-del, --delete <item>', 'delete file')
    .option('-d, --directory <src>', 'delete file')
    .option('-l, --list <src>', 'delete file')
    .parse(process.argv);
const options = program.opts();
//根路径
const curPath = process.cwd();
//判断是否是拷贝命令
if (options.copy) {
    //要拷贝文件的数据
    const fileData = fs.readdirSync("./src");
    //原文件路径
    const srcPtah = curPath + "/src/";
    //拷贝到目标文件的路径
    const copyPath = curPath + "/" + options.copy + "/";
    //判断拷贝目标文件存不存在
    if (!fs.existsSync(copyPath)) {
        fs.mkdirSync(copyPath)
    }
    // 1.实用fs模块完成目录深拷贝（8分）
    copyFile(fileData, srcPtah, copyPath)
}
function copyFile(dirName, ncePath, filePath) {
    dirName.forEach(item => {
        if (item.split(".")[1]) {
            fs.copyFileSync(ncePath + item, filePath + item);
        } else {
            if (!fs.existsSync(filePath + item)) {
                fs.mkdirSync(filePath + item);
            }
            let fileCbkData = fs.readdirSync(ncePath + item)
            let necCallback = ncePath + item + "/";
            let copyCallback = filePath + item + "/";
            copyFile(fileCbkData, necCallback, copyCallback)
        }
    })
}


// 3.使用commander包实现一个删除目录的命令---可递归删除目录（8分）
if (options.delete) {
    //删除文件夹的路径
    const delPath = curPath + "/" + options.delete + "/";
    //封装命令交互函数
    async function proFun(delFiles) {
        //待删除目录作为参数，判断是否存在，
        if (fs.existsSync(delFiles)) {
            //是否为空并给出相应提示（8分）
            if (fs.readdirSync(delFiles).length > 0) {
                let obj = await prompt([
                    {
                        type: "list",
                        name: "目标文件不为空是否删除?",
                        choices: ["yes", "no"]
                    }
                ])
                if (obj["目标文件不为空是否删除?"] === "yes") {
                    delFile(delPath);
                }
            } else {
                let obj = await prompt([
                    {
                        type: "list",
                        name: "文件为空是否删除?",
                        choices: ["yes", "no"]
                    }
                ])
                if (obj["文件为空是否删除?"] === "yes") {
                    delFile(delPath);
                }
            }
        } else {
            //并给出相应提示
            console.log("未找到目标文件");
        }
    }
    // 待删除目录作为参数
    proFun(delPath)
}
function delFile(delUrl) {
    //判断删除的文件夹是否存在
    if (fs.existsSync(delUrl)) {
        //删除目标文件夹的目录
        let delFileData = fs.readdirSync(delUrl)
        //遍历文件夹目录
        delFileData.forEach(item => {
            //判断是否是文件
            if (item.split(".")[1]) {
                //直接删除
                fs.unlinkSync(delUrl + "/" + item)
            } else {
                //继续遍历
                delFile(delUrl + "/" + item)
            }
        })
        //删除所有空文件夹
        fs.rmdirSync(delUrl);
    }
}

//6.实用commander实现一个bwlist命令查看目录信息（8分）
//7.bwlist无参数将当前目录所有内容输出到控制台（8分）
console.log(fs.readdirSync(curPath));
// 8.bwlist -d src将对应目录内容输出到控制台（8分）
if (Object.keys(options) == "directory") {
    console.log(fs.readdirSync(curPath + options.directory));
}

//9.bwlist -l src将目录内容详细信息输出到控制台，格式、大小、名称（8分）
if (Object.keys(options) == "list") {
    fs.stat(curPath+options.list,function(err,stats){
        if(err){
            return console.error(err);   
        }
        console.log(stats);
        console.log(stats.isFile());
        console.log(stats.isDirectory());
    });
}
